Hoşgeldiniz: OyunYapimi.org
 
Ara
Konular
  Üye Olun!    
Ana Menü
 Ana Sayfa
 Anketler
 Dosyalar
 Dökümanlar
 Forum
 Haber Arşivi
 WWW Linkleri
 Üye Listesi

Forumlar
Forumlarda Arama
 
[ Ara ]
Son yazilanlar

free ebooks - 2004-05-16 14:47 free ebooks...
oyun yazmak için - 2004-05-15 11:13 oyun yazmak için...
Sinus dalgası - 2004-05-14 19:21 Sinus dalgası...
Demosu yakında... - 2004-05-06 15:11 Demosu yakında......
Depth Test - 2004-05-03 20:55 Depth Test...
forum mesajlarini duzenlemek - 2004-05-03 19:34 forum mesajlarini ...
Başka Programlara Erişmek - 2004-05-03 17:44 Başka Programlara ...
Güzel bir e-book bağlantısı.. - 2004-05-03 16:06 Güzel bir e-book b...
Okyanus Dalgasi - 2004-05-03 16:00 Okyanus Dalgasi...
3d Shoot em up - 2004-05-03 15:57 3d Shoot em up...
Esnek Güç - 2004-05-03 13:32 Esnek Güç...
UltimateGameProgramming.com - 2004-05-03 12:29 UltimateGameProgra...
Function Pointer Nedir ne ise yarar - 2004-05-03 01:35 Function Pointer N...


Konu Disi


LAMER - 2004-05-10 01:58 LAMER...
anasafa yok forum var - 2004-05-08 16:01 anasafa yok forum ...
Anasayfa Kapali  Fakat.. - 2004-05-06 15:05 Anasayfa Kapali F...
Texture Arşivi - 2004-05-03 01:39 Texture Arşivi...
Yeni Kitap: Elektronik Hobi - 2004-05-03 00:29 Yeni Kitap: Elektr...
3DTURK - 2004-05-02 23:27 3DTURK...
Online Oyun - 2004-05-02 19:27 Online Oyun...


Splatt Forum


Konuyu açan kişi: deniz

OyunYapimi.org : Index » » OyunYapımı » » Function Pointer Nedir ne ise yarar
  
Yazar Function Pointer Nedir ne ise yarar
Darklight



Üyelik tarihi
31-10-2002

Mesajlar : 120

OFF-Line

 Yollanan 03-05-2004 at 01:35   
Function pointer ismindende anlasildigi gibi yazdiginiz bir fonksiyona pointer tutan degiskendir. Peki yararı ne heryere type switch yazmaktan kurtarir insani ve her objenize cok esnek bir sekilde RENDERER ve BEHAVIOUR yazmanızı saglar. Yani inanilmaz bir ozgurluk ve esneklik (Denedim calisiyorda baya güzel yani)

diyelimki sahnedeki objelerinizi temsil eden SahneObjeniz var

typedef struct _sceneObj{
int ID;
int type; //ENTITY / LIGHT / CAM / GROUP
Matrix TM;
entityObj *entity;
lightObj *light;
camObj *cam;
void (*renderingfunc)(int);
struct _sceneObj *child,*parent,*next,*prev;
}sceneObj;

bu kısımda entity nesnelerinden kasteddigim sahnenizdeki renderlediginiz objeler
//Mesela bende
GLUT
GLU
BUFFERED
MESH
tipinde veriyapisinda tuttugum entityler var hepsinin kendisine gore farkli avantajlari var tabiii


Sİmdi Bunun Rendererimizi yazdigimizda SceneGraphimizi renderleyen asagidaki basit fonksiyona bakalim

sObj->renderingfunc(sObj->entity); fonksiyonu ile istedigimiz tipteki entity istedigimiz renderer fonksiyonın içine sokariz ayni zamanda

sObj->behaviourfunc(sObj->entity); fonksiyonu ile istedigimiz tipteki entity istedigimiz behaviour fonksiyonın içine sokariz ayni zamanda


SceneGraphimizi renderleyelim simdide
/*------
FONKSIYON ISMI:renderSceneObj
YAPTIGI IS:
------*/
void renderSceneObj(sceneObj *sObj){
switch(sObj->type){
case SCENEOBJ_GROUP:
glPushMatrix();
glMultMatrixf(sObj->TM.index);
if(sObj->child!=NULL){
renderSceneObj(sObj->child);
}else if(sObj->next!=NULL){
glPopMatrix();
renderSceneObj(sObj->next);
}
glPopMatrix();
break;

case SCENEOBJ_CAMERA:
glPushMatrix();
glMultMatrixf(sObj->TM.index);
//renderCamera();
if(sObj->child!=NULL){
renderSceneObj(sObj->child);
}else if(sObj->next!=NULL){
glPopMatrix();
renderSceneObj(sObj->next);
}
glPopMatrix();
break;

case SCENEOBJ_ENTITY:
glPushMatrix();
glMultMatrixf(sObj->TM.index);
sObj->renderingfunc(sObj->entity);
if(sObj->child!=NULL) {
renderSceneObj(sObj->child);
}else if(sObj->next!=NULL){
glPopMatrix();
renderSceneObj(sObj->next);
}
glPopMatrix();
break;
}

}

/*------
FONKSIYON ISMI:renderTextureGluObj
YAPTIGI IS:Ekrana GLUObjlerini Renderler
-----*/
void renderTextureGluObj(entityObj *e){
disk *d;
sphere *s;
cylinder *c;

gluQuadricDrawStyle(quadric,GL_FILL);
gluQuadricNormals(quadric,GL_FLAT);
setGraphicMode(MODE_TEXTURE_NORMAL);
glBindTexture(GL_TEXTURE_2D, e->texID);
gluQuadricTexture(quadric, TRUE);

switch(e->pgluobj.type){
case GLUOBJ_SPHERE:
s=e->pgluobj.psphere;
gluSphere(quadric,s->radious,s->slices,s->stacks);
break;
case GLUOBJ_DISK:
d=e->pgluobj.pdisk;
gluDisk(quadric, d->innerRadious,d->outerRadious,d->slices, d->loops);
break;
case GLUOBJ_CYLINDER:
c=e->pgluobj.pcylinder;
gluCylinder(quadric, c->baseRadious,c->topRadious,c->height, c->slices, c->stacks);
break;
}
}


/*------
FONKSIYON ISMI:renderTextureBufferedObj
YAPTIGI IS:Ekran Buffered Objelerini Renderler
-----*/
void renderTextureBufferedObj(entityObj *e){
int ivertexDimension=3;
int itexDimension=2;
glShadeModel(GL_FLAT);
glBindTexture(GL_TEXTURE_2D, e->texID);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glEnableClientState(GL_VERTEX_ARRAY);
glTexCoordPointer(itexDimension,GL_FLOAT,0,e->pbuffered.t);
glVertexPointer(ivertexDimension,GL_FLOAT,0,e->pbuffered.v);
glDrawArrays(GL_QUADS,0,e->pbuffered.size);
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glBindTexture(GL_TEXTURE_2D,0);
}



Eger bu fonksiyon olmasaydı ne yapacaktiniz her bir rendering fonksiyonu için switch case fonksiyonu yazacaktiniz. Hızlı deneme ve test için kodlarda kullanılması gerekli bence

Nasil calisiyor peki
http://www.function-pointer.org
http://www.function-pointer.org

[ Bu mesajı düzenleyen: Darklight _FIL 03-05-2004 01:39 ]

 Profil  E-posta  www   Yolla   Düzenle  Gönder
  
Atla

Splatt Forum By: Splatt.it
Versione: 3.1






Web site Engine's code is Copyright © 2002 by PHP-Nuke. All Rights Reserved. PHP-Nuke is Free Software released under the GNU/GPL license.